package cn.seaboot.admin.reverse.service;

import cn.seaboot.flake.entity.MappingColumn;
import cn.seaboot.flake.entity.MappingTable;
import cn.seaboot.admin.reverse.dao.MappingColumnDao;
import cn.seaboot.admin.reverse.dao.MappingTableDao;
import cn.seaboot.commons.core.CommonUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * 项目数据库映射配置
 *
 * @author ChenSS 2019年2月27日 下午3:05:21
 */
@Service
public class MappingService {

    @Resource
    private MappingTableDao mappingTableDao;

    @Resource
    private MappingColumnDao mappingColumnDao;

    /**
     * 查询映射信息
     *
     * @param schemaName 数据库名
     * @param tableName  表名
     * @return DbMappingTable
     */
    public MappingTable queryMappingTable(String schemaName, String tableName) {
        MappingTable table = mappingTableDao.query(schemaName, tableName);
        if (table != null) {
            List<MappingColumn> l = mappingColumnDao.queryList(schemaName, tableName, null);
            table.setColumns(l);
        }
        return table;
    }

    /**
     * 查看表格映射配置，不包含列信息
     *
     * @param params 数据库名
     * @return DbMappingTable
     */
    public List<MappingTable> queryMappingTables(Map<String, Object> params) {
        return mappingTableDao.queryList(params);
    }

    /**
     * 删除映射信息
     *
     * @param schemaName 数据库名
     */
    public void deleteAll(String schemaName) {
        this.mappingColumnDao.deleteAll(schemaName);
        this.mappingTableDao.deleteAll(schemaName);
    }

    /**
     * 删除映射信息
     *
     * @param schemaName 数据库名
     * @param tableName  表名
     */
    public void delete(String schemaName, String tableName) {
        mappingTableDao.delete(schemaName, tableName);
        mappingColumnDao.delete(schemaName, tableName);
    }

    /**
     * 保存映射数据
     *
     * @param tables List<DbMappingTable>
     */
    public void saveMappingTables(List<MappingTable> tables) {
        for (MappingTable table : tables) {
            this.saveMappingTable(table);
        }
    }

    /**
     * 保存映射数据，要求字段的数据信息完整
     *
     * @param table DbMappingTable
     */
    public void saveMappingTable(MappingTable table) {
        this.delete(table.getSchemaName(), table.getTableName());
        mappingTableDao.insert(table);
        this.saveMappingColumn(table.getColumns());
    }

    /**
     * 保存映射数据
     *
     * @param columns List<DbMappingColumn>
     */
    public void saveMappingColumn(List<MappingColumn> columns) {
        if (CommonUtils.isNotEmpty(columns)) {
            for (MappingColumn column : columns) {
                mappingColumnDao.insert(column);
            }
        }
    }

    /**
     * 改表的基本信息
     *
     * @param table pojo
     * @return affected rows
     */
    public int updateMappingTable(MappingTable table) {
        return mappingTableDao.updateSampleById(table);
    }

    /**
     * 保存映射数据
     *
     * @param column DbMappingColumn
     */
    public int updateMappingColumn(MappingColumn column) {
        return mappingColumnDao.updateSampleById(column);
    }
}
